<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
</head>

<body>
    <script>
        function fun1() {
            console.log(this);
        }
        fun1();

        // 一：this指向：
        // 1.全局的函数中this指向window
        // 2.普通的函数中 this指向函数的调用者
        // 3.构造函数中 this指向 new 出来的实例化对象

        // 二： 箭头函数和普通函数的区别
        //           在 es6 中， 提供了⼀ 种简洁的函数写法， 我们称作“ 箭头函数”。
        //           写法：函数名=(形参)=>{……} 当函数体中只有⼀个表达式时，{}和 return 可以省略，当函数体中形
        //   参只有⼀个时，()可以省略。
        //     区别:

        // 1. 箭头函数不能⽤于构造函数，不能使⽤ new\*\* ⽽普通函数可以
        // 2. 在普通函数中，this 总是指向调⽤它的对象，如果⽤作构造函数，this 指向创建的对象实例,
        //    ⽽箭头函数指向箭头函数定义时的离 this 最近的⼀个函数，如果没有最近的函数就指向
        //    window。

        // 三：怎么改变this的指向
        // call apply  .bind() 还有箭头函数也能改变this
        // call和apply都能改变this的指向，并且会让函数立刻执行 如果不传参的时候 他们两个用法一样 传参的时候 apply传的是一个数组
        // 他们的第一个参数 是改变的this执行 后面的参数是给这个函数的传参，传参的时候call可以一个一个传 apply可以传一个数组
        // call和apply 使用的场景在面向对象继承构造函数里的属性的时候会使用到

        // bind也是改变this的指向 但是不会让函数立刻执行
        //         使用场景 比如在小程序中 发送一个请求wx.request success函数中的this指向的是undefined而不是小程序实例
        //         我们可以用箭头函数改变this  也可以用bind改变

        //         onLoad: function (options) {

        // wx.request({
        //     url: 'https://api.it120.cc/small4/banner/list',
        //     // success:(res)=> {
        //     //     console.log(this);
        //     //     this.setData({
        //     //         list: res.data.data
        //     //     })
        //     // }
        //     //改变this可以选择箭头函数

        //     success: function (res) {
        //         console.log(this);
        //         this.setData({
        //             list: res.data.data
        //         })
        //     }.bind(this)
        //     //也可以选择bind改变this
        // })
        // },

        var name = "window的name";
        var obj2 = {
            name: "德玛西亚",
        };

        let obj = {
            name: "小明",
            say: function(a, b) {
                console.log(this.name + a + b);
            }.bind(obj2),
            //this指向函数的调用者也就是obj
            run: () => {
                console.log(this.name);
            },
            //箭头函数里的this在声明的时候就定义下来了 指向 父级所在环境的this
        };
        // obj.say();
        // obj.run();

        // obj.say.call(window, "aa", "bb");
        // obj.say.apply(obj2, ["cc", "dd"]);

        obj.say("bind", "改变this");
    </script>
</body>

</html>